<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>函数</title>
    <script>

        var a = 1;
        var b = function () {
        }; // 函数也是一种值


        function funA(f) { // 这个函数定义形参, 接收一个函数作为实参 f = function () {console.log(1);}
            f(); //这里调用传递过来函数
        }

        function funB() {
            console.log(1);
        }

        /*  funA(funB);

          funA(function () { // 若函数是用一次, 那么直接定义匿名函数直接作为实参
              console.log(2);
          });*/

        // funA(1); 错误
        // 把函数作为参数传递给别函数或者方法, 称之为函数编程


        /* function funC() {
             console.log(arguments); // 获取函数执行的所有实参
         }

         funC();
         funC(1);
         funC(1, 'xx');
         funC('bb', 2, 3);*/


        var arr = [2, 5, 8];

        /* // 为什么这个方法这么设计
         // 底层帮我们把遍历套路写好了, 但是遍历要做什么事情由我们使用者来告诉它
         // 底层每次循环会调用你传递的函数
         arr.forEach(function (ele) {
             console.log(ele);
         });*/


        // 给数组对象添加一个方法  forEach2
        Array.prototype.forEach2 = function (fn) {
            // console.log(this); // 调用此方法数组对象
            for (var i = 0; i < this.length; i++) {
                // 每次循环调用传递过来的函数
                fn(arr[i], i, this);
            }
        };

        arr.forEach2(function (ele) {
            console.log(ele);
        });

    </script>
</head>
<body>

</body>
</html>